import unittest
from app import app

from test_helper import login
from test_helper import get_id_when_radio_exist

#Id del permiso con el que probara
ID_PERMISSION = '2'

class TestCase(unittest.TestCase):
    """
    Clase que implementa los test para el caso de uso Rol.
    Utilizamos esta clase para realizar las pruebas de nuestra aplicacion SAP
    """
    
    def setUp(self):
        """
        se llama a este metodo antes de iniciar el test de la aplicacion
        , este metodo crea un nuevo cliente de prueba.
        Se especifican las acciones a ser tomadas antes de iniciar el test
        """
        
        print "Iniciando test"
        #self.db_fd, app.config['DATABASE'] = tempfile.mkstemp()
        self.app = app.test_client()
        self.acceso = login(self.app)
       


    def tearDown(self):
        """
        se llama a este metodo al terminar el test el test de la aplicacion,
        en el se especifican las acciones a ser tomadas al finalizar el test
        """
        print "Terminando test"


    def test_get_all_roles(self):
        """
        Controla que se pueda acceder a los roles, ademas verifica que almenos
        el rol de administrador este creado
        """
        request = self.app.get('/rol/administracion', follow_redirects=True)
        assert 'Administrador' in request.data
        self.assertEqual(request._status, '200 OK')
   
   
    def test_crear_rol(self):
        """
        Controla que se puede crear un rol, y luego verifica si el rol fue 
        anhadido, atender que si el rol no se lista luego de ser creado el 
        test fallara.
        Ademas atender que el intenta crear un rol con el permiso con id [1,2]  
        si este id no existe fallara
        """
        
        print "Probando crear un rol"
        request = self._crear_rol('test rol', 'este es un rol de prueba', ID_PERMISSION)
     
        print "Respuesta satisfactoria, verificando si creo el rol"
        request_all = self.app.get('/rol/administracion', follow_redirects=True)
        assert 'test rol' in request_all.data
        print "Rol creado correctamente"


    def test_crear_rol_duplicado(self):
        """
        Test que prueba si se pueden crear roles duplicados
        """
        #Ahora probamos vovler a crear
        print "Creacion de rol con nombre repetido"
        request = self._crear_rol('test rol', 'este es un rol de prueba', ID_PERMISSION)
        print "Respuesta satisfactoria, verificando si dejo crear el rol"
        assert 'El nombre de rol ya existe, elija otro' in request.data
        print "Verificacion completa, no se pueden crear dos roles con el mismo nombre"


    def test_eliminar_rol(self):
        """
        Test que verifica si se puede eliminar un rol
        """
        print "Creando rol con nombre 'rol test 2'."
        crear_request = self._crear_rol('rol test 2', 'borrar', ID_PERMISSION)
        print "Verificando si se creo el rol"
        all_request = self._get()
        assert 'rol test 2' in all_request.data
        print "Rol creado exitosament"
        _id = get_id_when_radio_exist(all_request, 'rol test 2')
        path = 'rol/eliminar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'El rol ha sido eliminado con exito' in borrar_request.data

            
    def _crear_rol(self, nombre='test rol', descripcion='este es un rol de prueba', permisos=ID_PERMISSION):
        """
        Metodo que solo sirve para crear un rol, lo crea y retorna la respuesta
        @param nombre: nombre del nuevo rol
        @param descripcion: descripcion del nuevo rol
        @param premisos: permisos del nuevo rol
        """
        request = self.app.post('/rol/crear/', data=dict(
            nombre=nombre,
            descripcion=descripcion,
            permisos=permisos), follow_redirects=True)
        return request


    def _get(self, url ='/rol/administracion'):
        """
        Metodo que obtiene la pagina de administracion de roles
        @param url: url de la pagina de administracion de roles
        """
        return self.app.get(url, follow_redirects=True)
    

        
if __name__ == '__main__':
    unittest.main()